package br.fatec.model.dao;

import java.util.HashMap;
import java.util.List;

import br.fatec.model.entity.FormulaPadrao;
import br.fatec.util.Globals;
import br.fatec.util.Persistencia;

public class FormulaPadraoDao {

	private Persistencia persis;		
	
	public FormulaPadraoDao()
	{
		Globals globals = Globals.getInstance();
		
		this.persis = globals.getPersistencia();
	}
	
	public void cadastrar(FormulaPadrao formulaPadrao) throws Exception
	{	
		persis.cadastrar(formulaPadrao);	
	}
	
	public void alterar(FormulaPadrao formulaPadrao) throws Exception
	{	
		persis.alterar(formulaPadrao);
	}
	
	public void excluir(FormulaPadrao formulaPadrao) throws Exception
	{
		persis.excluir(formulaPadrao.getClass(), formulaPadrao.getCodigo());
	}
	
	public void desativar(FormulaPadrao formulaPadrao) throws Exception {
		formulaPadrao = consultar(formulaPadrao.getCodigo());
		
		formulaPadrao.setAtivo(false);
		
		persis.alterar(formulaPadrao);
	}
	
	public FormulaPadrao consultar(Integer codigo) throws Exception
	{	
		String query = "select * from formula_padrao where codigo = :codigo and ativo = :ativo"; 
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("codigo", codigo);
		parametros.put("ativo", true);
		
		return (FormulaPadrao)persis.consultar(FormulaPadrao.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<FormulaPadrao> listar() throws Exception
	{
		String query = "select * from formula_padrao where ativo = :ativo order by codigo asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);
		
		return (List<FormulaPadrao>)persis.listar(FormulaPadrao.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<FormulaPadrao> listar(String nome) throws Exception {
		String query = "select * from formula_padrao where nome ilike :nome and ativo = :ativo order by codigo asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("nome", "%" +nome+"%");
		parametros.put("ativo", true);

		return (List<FormulaPadrao>) persis.listar(FormulaPadrao.class, query, parametros);
	}

	@SuppressWarnings("unchecked")
	public List<FormulaPadrao> filtrar(String codigo, String nome, String veiculo, String descricao) throws Exception {
		String query = "select * from formula_padrao";
		query += " left join semiacabado on semiacabado.codigo = formula_padrao.veiculo_semi_acabado";
		query += " left join materia_prima on materia_prima.codigo = formula_padrao.veiculo_materia_prima";
		query += " where formula_padrao.ativo = :ativo";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);

		if (codigo != null && !codigo.isEmpty())
		{
			query += " and cast(formula_padrao.codigo as varchar(50)) ilike :codigo";
			parametros.put("codigo", "%" +codigo+"%");
		}

		if (nome != null && !nome.isEmpty())
		{
			query += " and formula_padrao.nome ilike :nome";
			parametros.put("nome", "%" +nome+"%");
		}
		
		if (veiculo != null && !veiculo.isEmpty())
		{
			query += " and (semiacabado.nome ilike :veiculo or materia_prima.nome ilike :veiculo)";
			parametros.put("veiculo", "%" +veiculo+"%");
		}

		if (descricao != null && !descricao.isEmpty())
		{
			query += " and formula_padrao.descricao ilike :descricao";
			parametros.put("descricao", "%" +descricao+"%");
		}
		
		query +=  " order by formula_padrao.codigo asc";
		
		return (List<FormulaPadrao>) persis.listar(FormulaPadrao.class, query, parametros);
	}
}
